package com.idanchuang.component.pushgateway.test;

import com.idanchuang.component.pushgateway.Pusher;
import io.prometheus.client.Histogram;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 *
 * Histogram指标
 *
 * @author yjy
 * @date 2020/4/13 15:19
 **/
@Component
public class HistogramRunner implements CommandLineRunner {

    // Histogram(直方图类型), Histogram 主要用于表示一段时间范围内对数据进行采样（通常是请求持续时间或响应大小），并能够对其指定区间以及总数进行统计，通常它采集的数据展示为直方图。
    // 在Prometheus自定义的metrics监控中，Histgram的使用可以参考如下：
    // 以请求响应时间requests_latency_seconds为例，比如我们需要记录http请求响应时间符合在分布范围{0.005，0.01，0.025，0.05，0.075，0.1，0.25，0.5，0.75，1，2.5，5，7.5，10}中的次数时
    private final static Histogram SAMPLE_HISTOGRAM = Histogram.build()
            // 填写指标名称 (字母/数字/下划线)
            .name("sample_histogram_index")
            // 设置自定义指标维度, 如: 应用, 实例, 响应码
            .labelNames("app", "http_code")
            // 指标说明
            .help("这里填写指标说明")
            // 设置样本桶
            .buckets(0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10)
            .create();

    @Autowired
    private Pusher pusher;

    @Override
    public void run(String... args) throws Exception {
        for (int i = 0; i < 10; i++) {
            // 多次上报样本指标
            pushHistogram("test_app", "200", (new Random().nextInt(10000) / 1000D), "sample_job");
        }
    }

    /**
     * 上报 counter 指标
     * @param app 应用
     * @param httpCode 状态码
     * @param value 值
     * @param job 工作组
     */
    private void pushHistogram(String app, String httpCode, double value, String job) throws IOException {
        SAMPLE_HISTOGRAM.labels(app, httpCode).observe(value);
        // groupingKey: 如果应用为集群部署, 则必须指定应用实例信息, 否则某一个应用重启后, 会将整个集群的指标重置
        Map<String, String> groupingKey = new HashMap<>();
        groupingKey.put("instance", InetAddress.getLocalHost().getHostAddress());
        pusher.pushAdd(SAMPLE_HISTOGRAM, job, groupingKey);
    }

}
